package com.xiayuxuanmin.weixinpay.servlet;

import net.sf.json.JSONObject;

import javax.jws.Oneway;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 页面和服务器建立的websocket服务连接
 * @Author xiayuxuanmin
 * @Date 2019/8/14
 * @Description
 */
@ServerEndpoint("/websocket/{id}")
public class WebSocket {

    private String id;//记录订单号
    private Session session;//当前连接(每个订单号要对应一个单独的session,利用订单号可以找到对应的webso)

    private static Map<String ,Session> allClients = new ConcurrentHashMap<>();//用于存放所有订单和websocket连接的map

    @OnOpen
    public void onOpen(@PathParam("id") String id, Session session){
        this.id = id;
        this.session = session;
        allClients.put(id,session);
    }

    @OnClose
    public void onClose(Session session){
        allClients.remove(id);
    }

    @OnError
    public void onError(Session session,Throwable e){
        if (session != null && session.isOpen()) {
            try {
                session.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        allClients.remove(id);
    }

    /**
     * 代表客户端给服务器发消息了,包括两个用户之间的通信也是  比如:A->B 发消息,那么A先给服务器发消息,告诉服务器我发给谁;服务器找到B的连接,再将内容转过去
     * @param session B对应的session
     * @param content 发送的消息
     */
    @OnMessage
    public void onMessage(Session session,String content){
        //首先,解析发送过过来的内容,找到目标接收者
        JSONObject jsonObject = JSONObject.fromObject(content);//将字符串转化为Object对象
        String to = jsonObject.getString("id");//找到接收者,页面发送请求过过来的时候,就要携带该参数
        String toMessage = jsonObject.getString("toMessage");;//发送的内容是什么
        //根据目标接收者,来获取目标对应的session连接
        Session toSession = allClients.get(to);
        //通过session发送消息
        if (toSession.isOpen()) {//如果是处于连接状态
            WebSocket.sendMessage(toSession,toMessage);
        }
    }

    /**
     * g给指定的session发送消息
     * @param session
     * @param message
     */
    public static void sendMessage(Session session,String message){
        if (session != null) {
            session.getAsyncRemote().sendText(message);
        }
    }

    /**
     * 根据订单号找到对应的session,再给session发送消息
     * @param id 订单ID
     * @param message 要发送的消息
     */
    public static void sendMessage(String id,String message){
        if (id != null) {
            Session session = allClients.get(id);
            sendMessage(session,message);
        }
    }

    public static Map<String, Session> getAllClients() {
        return allClients;
    }
}
